home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / lisp / kcl / akcl / kcl.lha / ustation / ild.c < prev    next >
C/C++ Source or Header  |  1986-01-17  |  4KB  |  204 lines

  1. #include <stdio.h>
  2. #include <a.out.h>
  3.  
  4. #define    POOLSIZ        100000
  5. #define    MY_SYMTABSIZ    10000
  6. #define    SYMTABSIZ    10000
  7.  
  8. struct Nlist {
  9.     char    *N_name;
  10.     int    N_type;
  11.     int    N_value;
  12. };
  13.  
  14. char pool[POOLSIZ+128];
  15. char *pp = pool;
  16.  
  17. struct bhdr my_header;
  18. struct Nlist my_Symtab[MY_SYMTABSIZ];
  19. int my_Sx;
  20.  
  21. struct bhdr header;
  22. char *text, *data, *bss;
  23. char *rtext, *rdata, *rbss;
  24. struct Nlist Symtab[SYMTABSIZ];
  25. int Sx;
  26. struct reloc rinfo;
  27.  
  28. main(argc, argv)
  29. int argc;
  30. char **argv;
  31. {
  32.     if (argc < 5) {
  33.         fprintf(stderr, "Arg count.\n");
  34.         exit(1);
  35.     }
  36.     get_myself(argv[1]);
  37.     rtext = (char *)atoi(argv[2]);
  38.     fasload(argv[3], argv[4]);
  39. }
  40.  
  41. get_myself(filename)
  42. char *filename;
  43. {
  44.     struct sym sym;
  45.     int i;
  46.     FILE *fp;
  47.     extern char *malloc();
  48.     
  49.     fp = fopen(filename, "r");
  50.     if (fp == NULL) {
  51.         fprintf(stderr, "Can't open %s.\n", filename);
  52.         exit(1);
  53.     }
  54.     fread(&my_header, sizeof(struct bhdr), 1, fp);
  55.     if (my_header.fmagic != FMAGIC && my_header.fmagic != NMAGIC) {
  56.         fprintf(stderr, "Illegal magic number: 0%o.\n", my_header.fmagic);
  57.         exit(1);
  58.     }
  59.     fseek(fp, my_header.tsize+my_header.dsize, 1);
  60.     for (my_Sx=0, i=0;  i<my_header.ssize-sizeof(struct sym);  my_Sx++) {
  61.         if (my_Sx >= MY_SYMTABSIZ) {
  62.             fprintf(stderr, "Too many symbols in %s.\n", filename);
  63.             exit(1);
  64.         }
  65.         if (pp >= &pool[POOLSIZ]) {
  66.             fprintf(stderr, "String table overflow.\n");
  67.             exit(1);
  68.         }
  69.         fread(&sym, 1, sizeof(struct sym), fp);
  70.         i += sizeof(struct sym);
  71.         my_Symtab[my_Sx].N_name = pp;
  72.         my_Symtab[my_Sx].N_type = sym.stype;
  73.         my_Symtab[my_Sx].N_value = sym.svalue;
  74.         while ((*pp = getc(fp)) != '\0') {
  75.             pp++;
  76.             i++;
  77.         }
  78.         pp++;
  79.         i++;
  80.     }
  81.     fclose(fp);
  82. }
  83.  
  84. fasload(filename, outputfilename)
  85. char *filename, *outputfilename;
  86. {
  87.     struct sym sym;
  88.     int i, n;
  89.     char name[100], *p;
  90.     int type, value;
  91.     int msx;
  92.     FILE *fp;
  93.     extern char *malloc();
  94.  
  95.     fp = fopen(filename, "r");
  96.     if (fp == NULL) {
  97.         fprintf(stderr, "Can't open %s.\n", filename);
  98.         exit(1);
  99.     }
  100.     fread(&header, sizeof(struct bhdr), 1, fp);
  101.     if (header.fmagic != FMAGIC) {
  102.         fprintf(stderr, "Illegal magic number: 0%o.\n", header.fmagic);
  103.         exit(1);
  104.     }
  105.     text = malloc(header.tsize+header.dsize);
  106.     data = text + header.tsize;
  107.     bss = data + header.dsize;
  108.     rdata = rtext + header.tsize;
  109.     rbss = rdata + header.dsize;
  110.     fread(text, 1, header.tsize+header.dsize, fp);
  111.     for (Sx=0, i=0;  i<header.ssize-sizeof(struct sym);  Sx++) {
  112.         if (Sx >= SYMTABSIZ) {
  113.             fprintf(stderr, "Too many symbols in %s.\n", filename);
  114.             exit(1);
  115.         }
  116.         fread(&sym, 1, sizeof(struct sym), fp);
  117.         i += sizeof(struct sym);
  118.         Symtab[Sx].N_type = type = sym.stype;
  119.         Symtab[Sx].N_value = value = sym.svalue;
  120.         p = name;
  121.         while ((*p++ = getc(fp)) != '\0')
  122.             i++;
  123.         i++;
  124.         if ((type & N_EXT) == 0 || (type & N_TYPE) != N_UNDF)
  125.             continue;
  126.         for (msx = 0;  msx < my_Sx;  msx++) {
  127.             if ((my_Symtab[msx].N_type & N_EXT) == 0)
  128.                 continue;
  129.             if (strcmp(my_Symtab[msx].N_name, name) == 0) {
  130.                 Symtab[Sx].N_value = my_Symtab[msx].N_value;
  131.                 goto CONTINUE;
  132.             }
  133.         }
  134. /*
  135.         if (value == 0)
  136. */
  137.             fprintf(stderr, "Undefined symbol: %s.\n", name);
  138. /*
  139.         Symtab[Sx].N_value = (int)(rtext + header.bsize);
  140.         header.bsize += value;
  141. */
  142.     CONTINUE:
  143.         ;
  144.     }
  145.     fseek(fp, sizeof(struct bhdr)+header.tsize+header.dsize+header.ssize, 0);
  146.     for (i = 0, n = header.rtsize / sizeof(struct reloc);
  147.         i < n;  i++) {
  148.         fread(&rinfo, sizeof(struct reloc), 1, fp);
  149.         relocate(text);
  150.     }
  151.     for (i = 0, n = header.rdsize / sizeof(struct reloc);
  152.         i < n;  i++) {
  153.         fread(&rinfo, sizeof(struct reloc), 1, fp);
  154.         relocate(data);
  155.     }
  156.     fclose(fp);
  157.     fp = fopen(outputfilename, "w");
  158.     if (fp == NULL) {
  159.         fprintf(stderr, "Can't open %s.\n", outputfilename);
  160.         exit(1);
  161.     }
  162.     fwrite(&header, sizeof(struct bhdr), 1, fp);
  163.     fwrite(text, 1, header.tsize+header.dsize, fp);
  164.     fclose(fp);
  165. }
  166.  
  167. relocate(where)
  168. char *where;
  169. {
  170.     int value;
  171.  
  172.     where += rinfo.rpos;
  173.     switch (rinfo.rsegment) {
  174.     case RTEXT:
  175.         value = (int)rtext;
  176.         break;
  177.  
  178.     case RDATA:
  179.         value = (int)rtext;
  180.         break;
  181.  
  182.     case RBSS:
  183.         value = (int)rtext;
  184.         break;
  185.  
  186.     case REXT:
  187.         value = Symtab[rinfo.rsymbol].N_value;
  188.         break;
  189.     }
  190.     switch (rinfo.rsize) {
  191.     case RBYTE:
  192.         *(char *)where += value;
  193.         break;
  194.  
  195.     case RWORD:
  196.         *(short *)where += value;
  197.         break;
  198.     
  199.     case RLONG:
  200.         *(int *)where += value;
  201.         break;
  202.     }
  203. }
  204.